package 纯字符串;

public class JZ44数字序列中某一位的数字 {

    /**
     * 数字以0123456789101112131415…的格式序列化到一个字符序列中。
     * 在这个序列中，第5位（从下标0开始计数）是5，第13位是1，第19位是4，等等。
     * 请写一个函数，求任意第n位对应的数字。
     *
     * 示例 1：
     * 输入：n = 3
     * 输出：3
     * 示例 2：
     * 输入：n = 11
     * 输出：0
     *  
     * 限制：
     * 0 <= n < 2^31
     * 注意：本题与主站 400 题相同：https://leetcode-cn.com/problems/nth-digit/
     */

    public int findNthDigit(int n) {

        if(n<10){
            return n;
        }

        int digit = 1;
        long start = 1;
        long count = 9;//0忽略掉 1~9(9) 10~99(90) 100~999(900)...都是9*10^n

        while (n>count){

            n-=count;//减去 1个字符的数量      //减去两个字符的数量
            digit+=1;//阶乘升级为10          //阶乘升级为100
            start*=10;//更新起点为10          //更新起点为1000
            //注意强转为long
            count=(long)Math.pow(10,digit-1)*String.valueOf(start).length()*9;//两个字符的数量为90  //三个字符的数量为900

//            System.out.println("n:"+n);
//            System.out.println("digit:"+digit);
//            System.out.println("start:"+start);
//            System.out.println("count:"+count);
        }

        // n>count 吃不完两个字符的数量,跳出来时卡在 10~99之间
        // n:6 digit=10 start=10 count=90
//        System.out.println("n:"+n);
//        System.out.println("digit:"+digit);
//        System.out.println("start:"+start);
//        System.out.println("count:"+count);

        //起点是10,n是往右走的步数
        //一个数字是多个? start的字符数量 sc; n/sc=吃进多少个 n%sc=有剩吗

        //01234567891011121314151617181920
        //212223242526272829303132333435363738394041424344454647484950515253545
        int length=String.valueOf(start).length();
        int index=n/length-1;//从起点开始,所以-1
        int over=n%length;
        char result='0';
        if(over==0){
            long lastNum=start+index;
            result=String.valueOf(lastNum).charAt((length-1));
        }else{
            long lastNum=start+index+1;
            result=String.valueOf(lastNum).charAt(over-1);//因为从0开始的
        }

        return (result-'0');
    }

    public static void main(String[] args) {
        JZ44数字序列中某一位的数字 jz=new JZ44数字序列中某一位的数字();
        int result = jz.findNthDigit(1000000000);
        System.out.println(result);

        System.out.println(Integer.MAX_VALUE);
        System.out.println(Long.MAX_VALUE);
        System.out.println(Float.MAX_VALUE);//3.4E38=3.4*(10^38)
        System.out.println(Double.MAX_VALUE);

//        System.out.println((long)100000000*9*9);
//        System.out.println(100000000*9*9);//默认int类型会溢出
    }

}
